var express = require('express')
var fs = require('fs')

var app = express()

//中间件：处理请求的，本质是一个函数
//同一个请求所经过的中间件，都是同一个请求

//Express中。对中间件有几种分类

//不关心请求路径和请求方法的，任何请求都会进入这个中间件
//next() 调用下一个中间件  也是要匹配的，不是紧挨着的
app.use(function (req, res, next) {
    console.log(1)
    next()
})

//以/xxx 开头的路径中间件
app.use('/a', function (req,res,next) {
    console.log('a')
    next()
})

app.use('/b', function (req,res,next) {
    console.log('b')
    console.log(req.url)
})

app.use(function (req, res, next) {
    console.log(2)
    next()
})

app.use('/a', function (req,res,next) {
    console.log('a 2')
    console.log(req.url)
})

app.use(function (req, res, next) {
    console.log(2)
    res.send('333 end')
})

//除了以上，还有一种严格匹配请求方法和请求路径的中间件
//app.get
//app.post
app.get('/', function (req,res, next) {
    console.log('/')
})

app.get('/', function (req,res,next) {
    fs.readFile('./a/b/c', function (err, data) {
        if (err) {
            //return res.status(500).send('server error)
            //当调用next的时候，如果传递了参数，则直接往后找到带有四个参数的应用程序级别中间件
            //当发生错误的时候，我们可以调用next传递错误对象
            //然后会被全局错误处理中间件匹配到并处理之
            next(err)
        }
    })
})

//配置错误处理中间件
app.use(function (err,req,res,next) {
    res.status(500).send(err.message)
})

app.listen(3000, function () {
    console.log('app is running at port 3000')
})